<?php
/**
 * Clase que gestiona las canciones
 */
class ListaReproduccion{
	/**
	 * Clase para la conexión a la BBDD
	 * @var Object
	 */
	private $MySQL;

	/**
	 * Identificador
	 * @var integer
	 */
	private $id;

	/**
	 * Identificador del usuario
	 * @var integer
	 */
	private $id_usuario;

	/**
	 * nombre
	 * @var string
	 */
	private $nombre;
        
	/**
	 * Canciones de la lista
	 * @var array con los ids de las canciones
	 */
	private $lista_canciones=array();

	/*
	 * Métodos de la Clase.
	 ***********************/

	/**
	 * Constructor
	 *
	 * Si recibe un identificador válido, se carga la canción de la BBDD mediante el método {@link cargar()}, en caso contrario crea un objeto
	 * vacío.
	 * @see cargar()
	 *
	 * @param integer $id
	 */
	public function __construct($id_listaReproduccion=null){
		$Validar = new Validar();
		$this->MySQL = new MySQL('MYLIED');

		if($Validar->id($id_listaReproduccion)){
			$this->id = $id_listaReproduccion;
			$this->cargar();
		}
	}

	/**
	 * Carga todos los datos para el cancion en la BBDD.
	 *
	 * Este método es invocado cuando se le pasa un id de ListaReproduccion válido al constructor, y a partir
	 * de éste se cargan todos sus datos de la BBDD.
	 */
	private function cargar(){
		try{
			if($this->id){
				$query = "SELECT *
                                                    FROM listas_reproduccion
                                                    WHERE id = '$this->id'; ";
				if(!($result = $this->MySQL->query($query)))
					throw new Exception("Error al cargar la lista");
				else if(mysql_num_rows($result) == 0)
					throw new Exception("La informaci&oacute;n de la lista no est&aacute; disponible.");

				$row = mysql_fetch_array($result);

				$this->id_usuario = $row['fk_usuario'];
				$this->nombre = $row['nombre'];
				$this->cargar_Canciones();
			}
		}catch(Exception $e){}
	}

	private function cargar_Canciones(){

		$this->comentarios=array();

                $listaCanciones = new ListaCanciones();
                $filtro = array('lista_reproduccion' => $this->id);

                $listaCanciones->buscar($filtro);

                while($cancion = $listaCanciones->siguiente())
                    $this->lista_canciones[] = $cancion->get_Id();
                
	}
	/**
	 * Devuelve el id de la lista
	 *
	 * @return integer $id Id de la lista.
	 */
	public function get_Id(){
		return $this->id;
	}

	/**
	 * Devuelve el id del usuario
	 *
	 * @return integer
	 */
	public function get_Id_Usuario(){
		return $this->id_usuario;
	}

        public function get_Usuario(){
            return new Usuario($this->id_usuario);
        }

	/**
	 * Devuelve el nombre de la lista
	 *
	 * @return string $nombre
	 */
	public function get_Nombre(){
		return $this->nombre;
	}

        /**
         * Devuelve el array de las canciones
         * @return <array> con los ids de las canciones
         */
	public function get_Lista_Canciones(){
		return $this->lista_canciones;
	}

	/**
	 * Borra la lista de la BBDD
	 */
	public function del_ListaReproduccion(){
		$query = "DELETE FROM listas_reproducciones WHERE id='$this->id'";
		$this->MySQL->query($query);

		$query = "DELETE FROM canciones_listas WHERE fk_lista_reproduccion='$this->id'";
		$this->MySQL->query($query);
	}

	public function crear($datos){
                
		//Comprobando los datos "imprescindibles":
		$errores = '';
		if($datos['nombre'] == '' || ! isset($datos['nombre']))
			$errores .= "El nombre es obligatorio.";

		if($errores != '') {
			throw new Exception($errores);
		}

                $this->nombre = stripslashes(trim($datos['nombre']));

                //Si el usuario viene dado lo usamos, si no cogemos el de la sesión.
                if($datos['id_usuario'])
                    $this->id_usuario = $datos['id_usuario'];
                else{
                    $Login = unserialize($_SESSION['login']);
                    $this->id_usuario = $Login->get_User();
                }
                $usuario = new Usuario($this->id_usuario);

                //Vemos si la lista ya existe para este usuario
                if($usuario->get_Listas_Reproduccion()){
                    foreach($usuario->get_Listas_Reproduccion() as $lista)
                        if($this->nombre == $lista->get_Nombre())
                            throw new Exception('Ya existe una lista con ese nombre');
                }

                $this->guardar();
		
		if(isset($datos['canciones']))
                    $this->add_Canciones($datos['canciones']);

		return $this->id;
	}

	/**
	 * Guarda en la BBDD los datos de la canción
	 */
	private function guardar(){
            $query = "INSERT INTO listas_reproduccion (nombre, fk_usuario)
                                         VALUES (
                                            '".mysql_real_escape_string($this->nombre)."',
                                            '$this->id_usuario'
                                            );";
		if(!$this->MySQL->query($query))
			throw new Exception("Error al crear la lista");

		$this->id = mysql_insert_id();
	}

	public function add_Canciones($ids_canciones){
            
            try{
                if($ids_canciones)
                foreach($ids_canciones as $id_cancion){
                        $this->add_Cancion($id_cancion);
                }
            }catch(Exception $e){
                //$this->del_ListaReproduccion();
                throw new Exception($e->getMessage());
            }
	}

	public function add_Cancion($id_cancion){            
            if(!in_array($id_cancion, $this->lista_canciones)){
                $query = "INSERT INTO canciones_listas (fk_lista_reproduccion, fk_cancion) VALUES ('$this->id', '$id_cancion');";
                
                if(!$this->MySQL->query($query))
                        throw new Exception("Error al a&ntilde;adir la canci&oacute;n.".$query);

                $this->lista_canciones[] = $id_cancion;
            }
	}

        public function del_Canciones($ids_canciones){
            try{
                foreach($ids_canciones as $id_cancion){
                        $this->del_Cancion($id_cancion);
                }
            }catch(Exception $e){
                //$this->del_ListaReproduccion();
                throw new Exception($e->getMessage());
            }
        }

        public function del_Cancion($id_cancion){            
            if(in_array($id_cancion, $this->lista_canciones)){
                $query = "DELETE FROM canciones_listas WHERE fk_cancion='$id_cancion' AND fk_lista_reproduccion='$this->id';";
                
                if(!$this->MySQL->query($query))
                    throw new Exception("Error al eliminar la canci&oacute;n.");

                foreach($this->lista_canciones as $key => $value) {
                    if($id_cancion == $value)
                        unset($this->lista_canciones[$key]);
                }
            }
	}

        public function set_Nombre($nombre){
            $query="UPDATE listas_reproduccion SET nombre='$nombre' WHERE id='$this->id';";
            if(!$this->MySQL->query($query))
                throw new Exception("Error al cambiar el nombre.");

            $this->nombre = $nombre;

        }
}
?>